package com.rpcLearning.common;

import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.ArrayList;
import java.util.List;

/**
 * @author:zyh
 * @Time:2021-03-17-15:51
 * @email:1269231889@qq.com
 * 反射工具类
 */
public class ReflectUtils {
    /*
    * 根据class创建对象
    * @param class 待创建类
    * @return 返回对应的实例
    * */
    public static <T> T newInstance(Class<T> clazz){
        try {
            return clazz.getDeclaredConstructor().newInstance();
        } catch (Exception e) {
            throw new IllegalStateException();
        }
    }

    /*
    * 返回所有的public方法
    *
    * @param class 要调用的类
    * @return 以数组的形式返回所有公共方法
    * */
    public static Method[] getPublicMethod(Class clazz){
        Method[] declaredMethod = clazz.getDeclaredMethods();
        List<Method> res = new ArrayList<>();
        for (Method method : declaredMethod) {
            //判断是否为public方法。
            if(Modifier.isPublic(method.getModifiers())){
                res.add(method);
            }
        }
        return res.toArray(new Method[0]);
    }
    /*
    * 调用指定对象的方法，
    *
    * @param obj 被调用的对象
    * @param method 被调用的方法
    * @param args 方法参数
    * @return 返回值
    * */
    public static  Object invoke(Object obj,Method method,Object... args){
        try {
            return method.invoke(obj,args);
        } catch (Exception e) {
            throw  new IllegalStateException(e);
        }
    }
}
